﻿using GDM.Hogar.Entidades;
using GDM.Hogar.Repositorios.Contratos;
using GDM.Hogar.Repositorios.Core;
using GDM.Hogar.Repositorios.Soporte;
using System.Collections.Generic;
using System.Data;
using System.Linq;

namespace GDM.Hogar.Repositorios
{
    public class UsuarioRepositorio : Repositorio, IUsuarioRepositorio
    {
        public UsuarioRepositorio(IDbManager dbManager)
            : base(dbManager)
        {
        }

        protected override string ProcEliminar
        {
            get { return string.Empty; }
        }

        protected override string ProcInsertar
        {
            get { return ProcedimientosAlmacenados.Usuario.Insertar; }
        }

        protected override string ProcActualizar
        {
            get { return ProcedimientosAlmacenados.Usuario.Actualizar; }
        }

        public void ActivarUsuario(int usuarioId, bool activo)
        {
            IList<Parametro> parametros = new List<Parametro>();
            parametros.Add(CrearParametro("@UsuarioId", DbType.Int64, ParameterDirection.Input, usuarioId));
            parametros.Add(CrearParametro("@Activo", DbType.Boolean, ParameterDirection.Input, activo));
            EjecutarConsulta(ProcedimientosAlmacenados.Usuario.Activar, parametros);
        }

        public void ActualizarUltimoAcceso(int usuarioId)
        {
            IList<Parametro> parametros = new List<Parametro>();
            parametros.Add(CrearParametro("@UsuarioId", DbType.Int64, ParameterDirection.Input, usuarioId));
            EjecutarConsulta(ProcedimientosAlmacenados.Usuario.ActualizarUltimoAcceso, parametros);
        }

        public void CambiarContraseña(int usuarioId, string contraseñaNueva)
        {
            IList<Parametro> parametros = new List<Parametro>();
            parametros.Add(CrearParametro("@UsuarioId", DbType.Int64, ParameterDirection.Input, usuarioId));
            parametros.Add(CrearParametro("@Contraseña", DbType.String, ParameterDirection.Input, contraseñaNueva));
            EjecutarConsulta(ProcedimientosAlmacenados.Usuario.CambiarContraseña, parametros);
        }

        public Usuario CrearUsuario(string nombreUsuario, string contraseña, int roleId)
        {
            IList<Parametro> parametros = new List<Parametro>();
            parametros.Add(CrearParametro("@NombreUsuario", DbType.String, ParameterDirection.Input, nombreUsuario));
            parametros.Add(CrearParametro("@Contraseña", DbType.String, ParameterDirection.Input, contraseña));
            parametros.Add(CrearParametro("@RolId", DbType.Int64, ParameterDirection.Input, roleId));
            return Insertar<Usuario>(parametros);
        }

        public void ActualizarUsuario(string nombreUsuario, int roleId, int usuarioId)
        {
            IList<Parametro> parametros = new List<Parametro>();
            parametros.Add(CrearParametro("@NombreUsuario", DbType.String, ParameterDirection.Input, nombreUsuario));
            parametros.Add(CrearParametro("@RolId", DbType.Int64, ParameterDirection.Input, roleId));
            parametros.Add(CrearParametro("@UsuarioId", DbType.Int64, ParameterDirection.Input, usuarioId));
            Actualizar(parametros);
        }

        public Usuario ObtenerUsuario(string nombreUsuario)
        {
            IList<Parametro> parametros = new List<Parametro>();
            parametros.Add(CrearParametro("@NombreUsuario", DbType.String, ParameterDirection.Input, nombreUsuario));
            return Obtener<Usuario>(ProcedimientosAlmacenados.Usuario.ObtenerPorNombre, parametros).FirstOrDefault();
        }

        public Usuario ObtenerUsuario(int usuarioId)
        {
            IList<Parametro> parametros = new List<Parametro>();
            parametros.Add(CrearParametro("@UsuarioId", DbType.Int64, ParameterDirection.Input, usuarioId));
            return Obtener<Usuario>(ProcedimientosAlmacenados.Usuario.Obtener, parametros).FirstOrDefault();
        }

        public IList<ConsultaUsuario> ObtenerUsuarios()
        {
            IList<Parametro> parametros = new List<Parametro>();
            return Obtener<ConsultaUsuario>(ProcedimientosAlmacenados.Usuario.ObtenerTodos, parametros);
        }
    }
}